home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / lib / happysrc / pcmain.c < prev    next >
Text File  |  1994-11-14  |  9KB  |  239 lines

  1. /************************************************
  2.  *                                              *
  3.  *       ***************************            *
  4.  *       *  HAPPy Pascal Compiler  *            *
  5.  *       ***************************            *
  6.  * ( HAPPy = H.Asano Pascal Processing system ) *
  7.  *                                              *
  8.  *     Original program                         *
  9.  *             ---  Pascal P4 ---               *
  10.  *                                              *
  11.  *     Pascal-P4は、public domainらしい。        *
  12.  *     このHAPPyの著作権は浅野比富美にある。     *
  13.  *     HAPPyは、Pascal-p4のソースをもとに、     *
  14.  *     アルゴリズムにたちかえって解析し、       *
  15.  *     PascalからC言語に書換え、ISO7185規格に    *
  16.  *     準拠させるため、独自の創作を加えたもの   *
  17.  *     である。 とはいっても、やっぱり物真似で  *
  18.  *     あることは充分承知しています。           *
  19.  *                                              *
  20.  *        Copyright(c) H.Asano. 1992-1994.      *
  21.  *           All rights resereved.              *
  22.  *                                              *
  23.  ************************************************/
  24.  
  25. #define EXTERN                          /* pascomp.hで使用            */
  26.  
  27. #define abnormal  1                     /* usage関数への引数          */
  28. #define normal    0                     /* usage関数への引数          */
  29.  
  30. #define NormalEnd     0                 /* 正常終了の終了コード       */
  31. #define CompileError  1                 /* コンパイルエラーの終了コード*/
  32. #define EtcError      2                 /* その他のエラーの終了コード */
  33.  
  34. #include <stdio.h>
  35. #include <string.h>
  36. #include <process.h>
  37. #include <stdlib.h>
  38. #include <jctype.h>
  39. #include "version.h"
  40. #include "pascomp.h"
  41.  
  42. extern void init(void) ;                /* 初期設定処理               */
  43. extern void programme(void);            /* promgramのコンパイル処理   */
  44.  
  45. FILE *passource ;                       /* pascalソースファイルポインタ */
  46. FILE *pcdfile   ;                       /* P-codeソースファイルポインタ */
  47.  
  48. const  char *asm = "PA.OVL"  ;          /* アセンブラのファイル名     */
  49. const  char *sext = ".pas"   ;          /* Pascalソースファイル拡張子 */
  50. const  char *oext = ".pco"   ;          /* P-codeオブジェクトファイル拡張子  */
  51. const  char *PcodeSourceName = "pcode.pcs" ; /* P-codeソースファイル名*/
  52. static char *TempPath        ;          /* 環境変数 TMP の 設定内容   */
  53. static char PcodeSname[50]   ;          /* P-codeソースファイルフルパス*/
  54. static char PcodeOname[50]   ;          /* P-codeオブジェクトファイル名*/
  55. static char path[50]         ;          /* コンパイラコマンドのパス名 */
  56.  
  57. static boolean asmlst = false  ;
  58.  
  59. /**************************************/
  60. /*    usage() : 使用方法出力処理      */
  61. /**************************************/
  62. static void usage(int type)
  63. {
  64. if(type == abnormal)
  65.  fputs("\nC001: 起動パラメータが誤っている\n",stderr);
  66. else {
  67.  fputs("\n  HAPPy is the H.Asano Pascal Processing system. (^_^)\n",
  68.              stderr);
  69.  fputs(
  70.   "\n  HAPPyはISO7185規格水準0にほぼ準拠したMS-DOS汎用Pascal処理系です。\n",
  71.            stderr) ;
  72.  fputs("  HAPPyの複写・再配付は自由です。\n", stderr) ;
  73. }
  74.  
  75.  fputs("\n  pcコマンドはPascalソースからカレントディレクトリにP-codeオブジェクト(ソース名.pco)を\n",
  76.          stderr);
  77.  fputs("  作ります。できたオブジェクトはpiコマンドで実行させます。\n\n",stderr);
  78.  
  79.  fputs("  使い方:  pc [ オプション... ] Pascalソースファイル名[.pas] [ オプション... ]\n",
  80.        stderr) ;
  81.  fputs("  オプション:\n",stderr);
  82.  fputs("     -c ・・・ 構文チェックのみ行う\n",stderr);
  83.  fputs("     -a ・・・ アセンブルリストを標準出力に出力する\n",stderr);
  84.  fputs("     -d ・・・ 範囲チェック等を行うコードを生成する\n",stderr);
  85.  
  86.      exit(EtcError);                    /* その他のエラーで終了       */
  87. }
  88.  
  89. /**********************************************/
  90. /* getobjname() : オブジェクトファイル名取得  */
  91. /**********************************************/
  92. static void getobjname(void)
  93. {
  94.   int i = 0 ;
  95.   int j = 0 ;
  96.  
  97. /*  ドライブ ':' \ディレクトリ\ディレクトリ\ ... \ファイル名 '.' 拡張子
  98.     という構成のソースファイルフルパスより 最後のファイル名を取り出し
  99.     拡張子 "pco" を付与する (漢字対応) */
  100.  
  101.      if(passname[1] == ':') i=j=2         ;
  102.      do {
  103.       if     (iskanji(passname[i])) i++   ;
  104.       else if(passname[i] == '\\')  j=i+1 ;
  105.      } while(passname[i++] != '.')        ; /* シフトJIS2バイト目と'.'は重ならない*/
  106.      strncpy(PcodeOname,passname+j,i-j-1) ;
  107.      strcpy(PcodeOname+i-j-1,oext)        ;
  108. }
  109.  
  110. /**************************************/
  111. /* argment() : 起動アーギュメント処理 */
  112. /**************************************/
  113. static void argment(int argc,char *argv[])
  114. {
  115.   int  i,j  ;
  116.   boolean getfileflag = false ;
  117.  
  118.     if(argc < 2)  usage(normal);        /* アーギュメントなしはusage  */
  119.  
  120.     for(i=strlen(*argv)-1;*(*argv+i)!='\\';i--) ; /* パスを取得       */
  121.     strncpy(path,*argv,i+1) ;
  122.     path[i+2] = '\0' ;
  123.     TempPath = getenv("TMP") ;          /* 環境変数 TMP を取得        */
  124.     pcode = true  ;                     /* Pコード出力要(デフォルト)      */
  125.     pcdinf= false ;                     /* Pコード情報出力不要(デフォルト)*/
  126.     debug = false ;                     /* 範囲チェック不要(デフォルト)   */
  127.     while(--argc) {
  128.      if(**++argv == '-') {
  129.       for(i=1;*(*argv+i)!='\0';i++)
  130.        switch(*(*argv+i)) {
  131.         case 'C' :
  132.         case 'c' : pcode  = false ;
  133.                    break          ;
  134.         case 'A' :
  135.         case 'a' : pcode  = true  ;
  136.                    pcdinf = true  ;
  137.                    asmlst = true  ;
  138.                    break          ;
  139.         case 'D' :
  140.         case 'd' : debug  = true  ;
  141.                    break          ;
  142.         default  : usage(abnormal);
  143.        }
  144.       if(i==1)  usage(abnormal);        /* - だけの時はusage          */
  145.      }
  146.      else {
  147.       if(getfileflag) {                 /* すでにソースファイル名を   */
  148.         usage(abnormal);                /* 取得している時は 誤り      */
  149.         break ;                         /* whileループ脱出            */
  150.       }
  151.       getfileflag = true      ;
  152.       *passname   = '\0'      ;
  153.       strcpy(passname, *argv) ;
  154.       j=0 ;                             /* 拡張子が省略されているか   */
  155.       while((*(passname+j)!='\0') && (*(passname+j)!='.')) j++ ;
  156.       if(*(passname+j)=='\0') strcat(passname,sext) ; /* 拡張子を付与 */
  157.      }
  158.     }
  159.  
  160.     if(getfileflag) {                   /* ファイル名が指定された時   */
  161.      passource = fopen(passname,"r");
  162.      if(passource == NULL) {
  163.       fprintf(stderr,"C002: Pascalソースファイル(%s)がない\n", passname);
  164.       exit(EtcError);
  165.      }
  166.      getobjname() ;                     /* オブジェクトファイル名取得 */
  167.     }
  168.     else usage(abnormal) ;              /* ファイル名の指定がない時   */
  169.  
  170.     if(pcode) {
  171.      strcpy(PcodeSname,TempPath) ;
  172.      if(iskanji(*(PcodeSname+strlen(PcodeSname)-2)) ||  /* 最後が漢字 */
  173.        (*(PcodeSname+strlen(PcodeSname)-1) != '\\'))    /* or \でない */
  174.       strcat(PcodeSname,"\\") ;                         /* \ を追加   */
  175.      strcat(PcodeSname,PcodeSourceName) ;
  176.      pcdfile = fopen(PcodeSname,"w");
  177.      if(pcdfile == NULL) {
  178.       fprintf(stderr,"C003: P-codeソースファイル(%s)が作れない\n",PcodeSname) ;
  179.       exit(EtcError);
  180.      }
  181.     }
  182. }
  183.  
  184. /***************************************/
  185. /*         term() : 終了処理           */
  186. /***************************************/
  187. void term(void)
  188. {
  189.   int resultcode ;
  190.   char instsize[7]  ;
  191.   char assembler[50] ;
  192.  
  193.     if(pcode && (errorcount == 0)) {
  194.      fputs(" *** Compile  completed. ***\n",stderr) ;
  195.      fclose(pcdfile) ;
  196.      strcpy(assembler, strcat(path,asm)) ;
  197.      sprintf(instsize,"%d",ic) ;
  198.      if(asmlst)
  199.       resultcode=execl(assembler,"",    /* アセンブルリスト出力指定   */
  200.                        instsize,PcodeSname,PcodeOname,version,"l",NULL);
  201.      else
  202.       resultcode=execl(assembler,"",    /* 通常のアセンブル           */
  203.                        instsize,PcodeSname,PcodeOname,version,NULL) ;
  204.  
  205.      if(resultcode == -1) {             /* アセンブラが起動できない   */
  206.       fprintf(stderr,"C004: アセンブラ(%s)が起動できない\n",assembler) ;
  207.       exit(EtcError) ;
  208.      }
  209.     }
  210.     else if(errorcount != 0) {
  211.      fprintf(stderr," *** %d errors detected. Fail in compile ***\n",
  212.                       errorcount);
  213.     exit(CompileError) ;
  214.     }
  215.     else {                              /* pcode = false              */
  216.      fputs(" *** No Error ***\n",stderr);
  217.      exit(NormalEnd) ;
  218.     }
  219. }
  220.  
  221. /**************************************/
  222. /*       main() : メイン処理          */
  223. /**************************************/
  224. void main(int argc,char *argv[])
  225. {
  226.  
  227.      fprintf(stderr,
  228.  "HAPPy Pascal Compiler Version %s  Copyright (c) H.Asano 1992-1994.\n",
  229.                                 version) ;
  230.  
  231.      argment(argc,argv) ;               /* 起動アーギュメント処理     */
  232.  
  233.      init() ;                           /* compiler 初期設定処理      */
  234.  
  235.      programme();                       /* programのコンパイル        */
  236.  
  237.      term() ;                           /* 終了処理                   */
  238. }
  239.